package com.bonc.common.utils;

import org.apache.commons.lang3.RandomUtils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Random;
import java.util.UUID;

/**
 * @author cxy
 * @Title: AppUtils
 * @Description: 随机产生唯一的app_key和app_secret
 * @date 2021年10月12日13:59:12
 */
public class AppUtils {
    //生成 app_secret 密钥
    private final static String SERVER_NAME = "mazhq_abc123";
    private final static String[] chars = new String[]{"a", "b", "c", "d", "e", "f",
            "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
            "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I",
            "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
            "W", "X", "Y", "Z"};

    /**
     * @Description: <p>
     * 短8位UUID思想其实借鉴微博短域名的生成方式，但是其重复概率过高，而且每次生成4个，需要随即选取一个。
     * 本算法利用62个可打印字符，通过随机生成32位UUID，由于UUID都为十六进制，所以将UUID分成8组，每4个为一组，然后通过模62操作，结果作为索引取出字符，
     * 这样重复率大大降低。
     * 经测试，在生成一千万个数据也没有出现重复，完全满足大部分需求。
     * </p>
     * @author cxy
     * @date 2021年10月12日14:01:48
     */
    public static String getAppId() {
        StringBuffer shortBuffer = new StringBuffer();
        String uuid = UUID.randomUUID().toString().replace("-", "");
        for (int i = 0; i < 8; i++) {
            String str = uuid.substring(i * 4, i * 4 + 4);
            int x = Integer.parseInt(str, 16);
            shortBuffer.append(chars[x % 0x3E]);
        }
        return shortBuffer.toString();

    }

    /**
     * <p>
     * 通过appId和内置关键词生成APP Secret
     * </P>
     * @author cxy
     * @date 2021年10月12日13:59:29
     */
    public static String getAppSecret(String appId) {
        try {
            String[] array = new String[]{appId, SERVER_NAME};
            StringBuffer sb = new StringBuffer();
            // 字符串排序
            Arrays.sort(array);
            for (int i = 0; i < array.length; i++) {
                sb.append(array[i]);
            }
            String str = sb.toString();
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            md.update(str.getBytes());
            byte[] digest = md.digest();

            StringBuffer hexstr = new StringBuffer();
            String shaHex = "";
            for (int i = 0; i < digest.length; i++) {
                shaHex = Integer.toHexString(digest[i] & 0xFF);
                if (shaHex.length() < 2) {
                    hexstr.append(0);
                }
                hexstr.append(shaHex);
            }
            return hexstr.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            throw new RuntimeException();
        }
    }

    public static final String MD5_32bit(String readyEncryptStr) throws NoSuchAlgorithmException{
        if(readyEncryptStr != null){
            //The cipher text converted to hexadecimal string
            StringBuilder su = new StringBuilder();
            //Get MD5 digest algorithm's MessageDigest's instance.
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte [] b = md.digest(readyEncryptStr.getBytes());
            int temp = 0;
            //byte array switch hexadecimal number.
            for(int offset = 0,bLen = b.length; offset < bLen; offset++){
                temp = b[offset];
                if(temp < 0){
                    temp += 256;
                }
                int d1 = temp / 16;
                int d2 = temp % 16;
                su.append(Integer.toHexString(d1) + Integer.toHexString(d2)) ;
            }
            System.out.println(su.toString().toUpperCase());
            return su.toString().toUpperCase();
        }else{
            return null;
        }
    }

    public static String getRandomReqNo(){
        int length = 8;
        String base = "0123456789";
        Random random = new Random();
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<length;i++){
            int number = random.nextInt(base.length());
            sb.append(base.charAt(number));
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        /*String appId = getAppId();
        String appSecret = getAppSecret(appId);
        System.out.println("appId: "+appId);
        System.out.println("appSecret: "+appSecret);
        System.out.println(UUID.randomUUID().toString().toUpperCase().replace("-",""));


        Calendar cal = Calendar.getInstance();

        SimpleDateFormat sdFormat = new SimpleDateFormat("yyyyMMddHHmmss");

        String myTime = sdFormat.format(cal.getTime());
        System.out.println(myTime);
        System.out.println(System.currentTimeMillis());*/
        /*String a = "ceshi.txt|ceshiwendang.txt";
        String str[] = a.split("\\|");   2021 1027 023427846
        for(int i=0;i<str.length;i++){
            System.out.println(str[i]);
        }*/

        //System.out.println(getRandomReqNo());

        String url = "2021/10/GZLSEND_1001_351_20211117_002.xlsx|2021/10/GZLSEND_1001_351_20211117_003.xlsx|2021/01/ceshi.txt";
        String str[] = url.split("\\|");
        StringBuffer buffer = new StringBuffer();
        for(int j=0;j<str.length;j++) {
            System.out.println(str[j]);
            String directory = str[j].substring(0,str[j].lastIndexOf("/")+1);
            String fileName = str[j].substring(str[j].lastIndexOf("/")+1);
            System.out.println(directory);
            System.out.println(fileName);
            if(j == str.length-1){
                buffer.append(fileName);
            }else{
                buffer.append(fileName+"|");
            }
        }
        System.out.println(buffer);
    }
}
